﻿#include "GlobalMsg.h"






//包构建器，将多个数据包构建成一个
QByteArray packManger::buildData(QList<QByteArray> bytes)
{
    QByteArray t_retData;
    uint32_t t_length = 0;
    //计算需要的尺寸
    for(QList<QByteArray>::iterator i = bytes.begin(); i < bytes.end(); i++){
        t_length += i->length();
    }
    t_length += bytes.length() * sizeof(uint32_t); //把长度信息也保存在内
    t_retData.resize(t_length);

    uint32_t t_size = 0;
    t_length = 0;
    for(QList<QByteArray>::iterator i = bytes.begin(); i < bytes.end(); i++){

        t_size = i->length();
        memcpy(t_retData.data() + t_length,&t_size,sizeof(uint32_t));
        memcpy(t_retData.data() + t_length + sizeof(uint32_t),i->data(),t_size);
        t_length += (t_size + sizeof(uint32_t));
    }
    return t_retData;
}


//将一个组合包拆分成多个数据包
QList<QByteArray> packManger::parserData(QByteArray data)
{
    //验证数据是否可用
    QList<QByteArray> t_retList;
    uint32_t t_length = 0;

    for(qsizetype i = 0;i < data.length();){
        if(i > data.length() - sizeof(uint32_t)){ //判断标记符是否已经超出内存限制
            break;
            return QList<QByteArray>(); //数据有问题，直接返回空数据
        }

        memcpy(&t_length,data.data() + i,sizeof(uint32_t)); //获取数据的长度标记

        if(i + t_length + sizeof(uint32_t) > data.length()){ //判断数据是否已经超出容器
            return QList<QByteArray>(); //数据有问题，直接返回空数据
        }

        QByteArray t_d;
        t_d.resize(t_length);
        memcpy(t_d.data(),data.data() + i + sizeof(uint32_t),t_length);
        i += t_length + sizeof(uint32_t); //将数据偏移增加
        t_retList.append(t_d);

    }
    return t_retList;
}







////连接信息
//QList<serverMsg> clientMsg::serverList; //服务器列表信息
//serverMsg clientMsg::conServer; //当前连接的Server信息
//QTcpSocket* clientMsg::tcpCon = nullptr; //TCP长连接
//QUdpSocket* clientMsg::udpCon = nullptr; //UDP长连接
//QList<proxyMsg> clientMsg::proxyList; //映射代理信息表



////TCP当断开连接
//void OnTcpDisConnect()
//{

//}


////TCP收到数据
//void OnTcpReadyRead()
//{
//    QByteArray t_data = clientMsg::tcpCon->readAll();
//    //std::cout << t_data.toStdString()<<std::endl;

//    //    for(int a=0;a<t_data.length();a++){
//    //        qDebug() << t_data.at(a) << "   " << t_data.length();
//    //    }


//    if(t_data.at(0) == '\0'){ //呼吸包
//        return;
//    }
//    else if(t_data.at(0) == '\1'){ //返回了TCP端口信息，开始绑定
//        QByteArray t_sendData;
//        int t_serverID= t_data.toInt(); //对方ID
//        t_sendData.append('\1'); //返回TCP验证信息
//        t_sendData.append(QByteArray::number(t_serverID));
//        clientMsg::udpCon->writeDatagram(t_sendData,QHostAddress(clientMsg::conServer.host),clientMsg::conServer.udp_Port);
//    }
//}


////UDP收到数据
//void OnUdpReadyRead()
//{

//}



